
#ifndef APP_KEY_H
#define APP_KEY_H

#include "stdint.h"
#include "gpio.h"

#ifndef KEY_PRESS_PWR_SWITCH_TH_MS
#define KEY_PRESS_PWR_SWITCH_TH_MS  2000
#endif

// 键按下状态枚举
typedef enum 
{
    KEY_IDLE                = 0,  // 无按键按下
    KEY_SHORT_PRESS         = 1,  // 短按
    KEY_LONG_PRESS          = 2,  // 长按
    KEY_RELEASED            = 3,  // 按键释放
    KEY_MULTI_PRESS         = 4,  // 连续多次按下（例如3次或6次）
    KEY_PRESS_2S            = 5,  // 按下超过2秒
    KEY_PRESS_SIX_TIMES     = 6,  // 按键按下6次，进入测试模式
    KEY_PRESS_PWR_SWITCH    = 7   // 按键按下，电源切换
} KeyPressState;



typedef struct 
{
    uint32_t last_interrupt_time;          // 上次中断触发时间，用于去抖处理
    uint32_t key_press_start;              // 按键按下开始时间
    uint32_t last_short_press_time;        // 最后一次短按时间，用于超时清零
    uint8_t key_press_count;               // 按键短按计数
    uint8_t is_pressed              :1;    // 按键是否处于按下状态 (1=按下, 0=释放)
    uint8_t is_long_press           :1;    // 是否检测到长按 (1=是, 0=否)
    uint8_t is_times_task_6         :1;
    uint8_t is_tim_cb_wait_clear    :1;    //按键状态已经在定时器里进行操作，松开操作不再计数
    uint8_t resv1                   :4;
    uint8_t debounce_time;                 // 去抖时间（单位ms） 
    uint32_t long_press_threshold;         // 长按阈值时间（单位ms）
    KeyPressState key_state;               // 当前按键状态
} KeyPressData;


void app_key_timeout(void);

/**
 * @brief EXTI 中断回调函数。
 * 
 * 当任意一个配置为外部中断的 GPIO 引脚发生中断时调用。
 * 应由 HAL 库调用此函数，用户在此函数中处理按键逻辑。
 * 
 * @param GPIO_Pin 引脚编号，表示触发中断的 GPIO 引脚。
 */
extern void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);





#endif // APP_BUZZER_H

